home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Software Contest 3 / FM Towns Software Contest 3.iso / exp / astral / a1 / game / source / line.asm < prev    next >
Assembly Source File  |  1994-01-07  |  3KB  |  127 lines

  1. .386p
  2.  
  3. ;----------------------------------------------------------------------------
  4. ;    void pset(int x,int y,int color,int page)
  5. ;----------------------------------------------------------------------------
  6.  
  7. code    segment
  8.     assume    cs:code
  9.  
  10. public    pset
  11.     db    'pset',4
  12.  
  13. pset    proc    near
  14.  
  15.     push    ds
  16.  
  17.     mov    dx,120h
  18.     mov    ds,dx
  19.  
  20.     mov    cx,ss:[esp]+4+12
  21.     mov    eax,ss:[esp]+4+16
  22.     shl    eax,16
  23.     mov    al,ss:[esp]+4+4        ;x1を読み込む
  24.     mov    ah,ss:[esp]+4+8        ;y1  〃
  25.     lea    edx,[eax*2]
  26.  
  27.     mov    ds:[edx],cx
  28.  
  29.     pop    ds
  30.  
  31.     ret
  32.  
  33. pset    endp
  34.  
  35. ;    ラインルーチン本体
  36.  
  37. ;void line(int x1,int y1,int x2,int y2,int col,int page);
  38. ;    for 256*512*32K colors (GRAPHIC MODE 5) only
  39.  
  40.     public    line        ;このへんはおまじないと思ってください
  41.     db    'line',4    ;for stackdump
  42.  
  43. line    proc    near
  44.     push    ebp
  45.     push    esi
  46.     push    edi
  47.     push    ebx
  48.  
  49.     mov    bp,ss:[esp+20+16]    ;色を読み込む
  50.     mov    edi,ss:[esp+20+20]    ;ページを読み込む
  51.     shl    edi,17
  52.     mov    bh,ss:[esp+20+0]    ;x1を読み込む
  53.     mov    bl,ss:[esp+20+4]    ;y1  〃
  54.     mov    ch,ss:[esp+20+8]    ;x2  〃
  55.     mov    cl,ss:[esp+20+12]    ;y2  〃
  56.     mov    dh,bl
  57.     mov    dl,bh
  58.     movzx    edx,dx
  59.     lea    esi,[edi+edx*2]    ;(x1,y1)のアドレス
  60.                 ;を求める
  61.     push    ds        ;dsをVRAMのセレクタに
  62.     mov    dx,120h        ;にする
  63.     mov    ds,dx
  64.  
  65.     mov    edx,2        ;edxが横方向の増加量
  66.     sub    ch,bh
  67.     jnb    short #liney    ;xが増える方向に線を引く?
  68.     neg    edx        ;減る方向だとedxをマイナスにする
  69.     neg    ch
  70. #liney:    mov    edi,512        ;ediが縦方向の増加量
  71.     sub    cl,bl
  72.     jnb    short #liner    ;yが増える方向に線を引く?
  73.     neg    edi        ;減る方向だとediをマイナスにする
  74.     neg    cl
  75.  
  76. #liner:    cmp    ch,cl        ;xとyのどちらの変化量が
  77.     je    short #lines    ;大きいか調べて,chが
  78.     ja    short #lineg    ;大きいようにする
  79.     xchg    ch,cl        ;同じ時はlinesに飛ぶ
  80.     xchg    edi,edx        ;縦横の変化量も取り替える
  81.  
  82. #lineg:    mov    ah,cl        ;割り算をして,
  83.     mov    al,0        ;傾きを求める。
  84.     div    ch
  85.     mov    ah,128
  86.  
  87.         movzx   cx,ch           ;ループカウンタに
  88.         movzx   ecx,cx          ;横方向のドット数を
  89.         inc     cx              ;いれる。
  90.  
  91.     align    4
  92. #lineg1:
  93.     mov    ds:[esi],bp    ;1ドット点をかく
  94.     add    esi,edx        ;横に座標を動かす
  95.     add    ah,al        ;傾きを足す
  96.     jnb    short #lineg2    ;あふれたら縦に
  97.     add    esi,edi        ;点を動かす
  98. #lineg2:
  99.     loop    #lineg1        ;ループ
  100.     jmp    #exit
  101.  
  102.     align 4
  103. #lines: movzx   cx,ch           ;ループカウンタに
  104.         movzx   ecx,cx          ;横方向のドット数を
  105.         inc     cx              ;いれる
  106.  
  107.     align    4
  108. #lines1:            ;傾きが1のときの
  109.     mov    ds:[esi],bp    ;ルーチン
  110.     add    esi,edx        ;縦横に1回ずつ
  111.     add    esi,edi        ;動かしてドットをかく
  112.     loop    #lines1
  113.  
  114. #exit:
  115.     pop    ds        ;スタックを元に
  116.     pop    ebx        ;戻す
  117.     pop    edi
  118.     pop    esi
  119.     pop    ebp
  120.     ret
  121.  
  122. line    endp
  123.  
  124. code    ends
  125.  
  126. end
  127.